#include "Socket.hpp"
#include "log.hpp"
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <functional>
using namespace std;
class httpSever
{
    typedef function<void(int)> func_t;
public:
    httpSever(uint16_t port,func_t func,string ip = "0.0.0.0")
    :_func(func)
    {
        
        //创建监听socket
        _listensocket = _sock.Socket();
        //绑定监听socket和ip和端口
        _sock.Bind(_listensocket,port,ip);
        //开始监听
        _sock.Listen(_listensocket);
    }
    void start()
    {
        signal(SIGPIPE,SIG_IGN);
        signal(SIGCHLD,SIG_IGN);
        for( ; ; )
        {
            uint16_t port;
            string ip;
            int accepted_sock = _sock.Accept(_listensocket,&ip,&port);
            //接收到sock 开辟子进程，父进程直接关闭sock，子进程进行
            if(fork() == 0)
            {
                //第一步关闭不需要的sock
                close(_listensocket);
                //执行回调函数
                _func(accepted_sock);
                exit(0);
            }
            //父进程代码
            close(accepted_sock);

        }
    }
    ~httpSever()
    {
        if(_listensocket >= 0) close(_listensocket);
    }
private:
    Sock _sock;
    int _listensocket;
    func_t _func;
};